﻿// ===============================================================================
//  Copyright © NewSQL.CN. All rights reserved .
//  技术论坛：http://newsql.cn/
//  个人博客：http://www.ymind.net/
//  版权所有：NewSQL中文社区 彦铭工作室
// ===============================================================================

using System;
using System.Data;
using System.Runtime.InteropServices;

namespace Newsql.Data.RDBMS
{
	/// <summary>
	/// 将类的属性与数据表中的一个字段绑定起来。
	/// </summary>
	[Serializable]
	[ComVisible(true)]
	[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, Inherited = false, AllowMultiple = false)]
	public sealed class ColumnAttribute : Attribute
	{
		/// <summary>
		/// 初始化 <see cref="ColumnAttribute"/> 类的新实例。
		/// </summary>
		public ColumnAttribute() : this(String.Empty) { }

		/// <summary>
		/// 初始化 <see cref="ColumnAttribute"/> 类的新实例。
		/// </summary>
		/// <param name="name">字段名。</param>
		public ColumnAttribute(string name) : this(name, DbType.Object) { }

		/// <summary>
		/// 初始化 <see cref="ColumnAttribute"/> 类的新实例。
		/// </summary>
		/// <param name="name">字段名。</param>
		/// <param name="dbtype"><see cref="DbType"/> 枚举值之一。</param>
		public ColumnAttribute(string name, DbType dbtype) : this(name, dbtype, 0) { }

		/// <summary>
		/// 初始化 <see cref="ColumnAttribute"/> 类的新实例。
		/// </summary>
		/// <param name="name">字段名。</param>
		/// <param name="dbtype"><see cref="DbType"/> 枚举值之一。</param>
		/// <param name="size">字段大小。</param>
		public ColumnAttribute(string name, DbType dbtype, int size)
		{
			this.Name = name;
			this.DBType = dbtype;
			this.Size = size;
		}

		/// <summary>
		/// 获取或设置字段名。
		/// </summary>
		public string Name { get; set; }

		/// <summary>
		/// 获取或设置字段类型。
		/// </summary>
		public DbType DBType { get; set; }

		/// <summary>
		/// 获取或设置字段大小。
		/// </summary>
		public int Size { get; set; }

		/// <summary>
		/// 获取或设置字段值的精度。
		/// </summary>
		public byte Precision { get; set; }

		/// <summary>
		/// 获取或设置标识种子。
		/// </summary>
		public byte Scale { get; set; }

		/// <summary>
		/// 获取或设置一个值，该值指示当前字段是否拥有主键。
		/// </summary>
		public bool PrimaryKey { get; set; }

		/// <summary>
		/// 获取或设置一个值，该值指示当前字段是否启用了自动标识特性（如自增自减字段）。
		/// </summary>
		public bool AutoIncrement { get; set; }
	}
}
